package com.by.rpc.netty;

import com.by.rpc.config.KryoSerializer;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * Kryo解码器，用于将字节数组解码为对象
 */
public class KryoDecoder extends ByteToMessageDecoder {

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // 检查是否有足够的数据读取消息长度
        if (in.readableBytes() < 4) {
            return;
        }

        in.markReaderIndex();
        int dataLength = in.readInt();

        // 验证消息长度是否合法
        if (dataLength <= 0) {
            ctx.close(); // 非法长度，关闭连接
            return;
        }

        // 检查是否有足够的数据读取完整消息
        if (in.readableBytes() < dataLength) {
            in.resetReaderIndex();
            return;
        }

        try {
            // 读取数据并反序列化
            byte[] data = new byte[dataLength];
            in.readBytes(data);

            Object obj = KryoSerializer.deserialize(data);
            if (obj != null) {
                out.add(obj);
            }
        } catch (Exception e) {
            // 记录异常并关闭连接
            System.err.println("Failed to deserialize object: " + e.getMessage());
            ctx.close();
        }
    }
}